package outros;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;

public class ModeloTabela extends AbstractTableModel {
    private ArrayList linhas = null;
    private String[] colunas = null;
    private JTable pai = null;
    private JTableHeader header = null;
    private int crescente = -1;

    public void apagarLinhas() {
        while (getLinhas().size() > 0) {
            getLinhas().remove(0);
        }
        fireTableDataChanged();
    }

    public void setTabela(JTable tabela, final int coluna) {
        pai = tabela;
        header = pai.getTableHeader();
        header.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //int vColIndex = pai.getColumnModel().getColumnIndexAtX(e.getX());
                //final int mColIndex = pai.convertColumnIndexToModel(vColIndex);
                if (crescente == 1) {
                    crescente = -1;
                } else {
                    crescente = 1;
                }
                Collections.sort(getLinhas(), new Comparator() {

                    public int compare(Object o1, Object o2) {
                        String[] v1 = (String[]) o1;
                        String[] v2 = (String[]) o2;
                        Comparable i1 = (Comparable) v1[coluna];
                        Comparable i2 = (Comparable) v2[coluna];
                        return (i1.compareTo(i2)) * crescente;
                    }
                });
                pai.repaint();
            }
        });
    }

    public JTable getTabela() {
        return pai;
    }

    public ArrayList getDataVector() {
        return linhas;
    }

    public ModeloTabela(ArrayList lin, String[] col) {
        setLinhas(lin);
        setColunas(col);
    }

    public ArrayList getLinhas() {
        return linhas;
    }

    public void setLinhas(ArrayList dados) {
        linhas = dados;
    }

    public String[] getColunas() {
        return colunas;
    }

    public void setColunas(String[] nomes) {
        colunas = nomes;
    }

    public int getColumnCount() {
        return colunas.length;
    }

    public int getRowCount() {
        return linhas.size();
    }

    @Override
    public String getColumnName(int numCol) {
        return colunas[numCol];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        //if (col == 0) {
        return false;
        //} else {
        //return true;
        //}
    }

    public Object getValueAt(int numLin, int numCol) {
        Object[] linha = (Object[])getLinhas().get(numLin);
        return linha[numCol];
    }

    @Override
    public void setValueAt(Object dado, int numLin, int numCol) {
        Object[] linha = (Object[]) getLinhas().get(numLin);
        linha[numCol] = dado;
        fireTableDataChanged();
    }

    public void addRow(Object[] dados) {
        getLinhas().add(dados);
        fireTableDataChanged();
    }

    public void removeRow(int numLin) {
        getLinhas().remove(numLin);
        fireTableDataChanged();
    }

    public Class getColumnClass(int column) {
        Class returnValue;
        if ((column >= 0) && (column < getColumnCount())) {
            returnValue = getValueAt(0, column).getClass();
        } else {
            returnValue = Object.class;
        }
        return returnValue;
    }
    /*public Class getColumnClass(int numCol) {
    Object[] linha = (Object[])getLinhas().get(0);
    return linha[numCol].getClass();
    }*/
}